package com.dagger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import com.dagger.constant.MessageConstants;
import com.dagger.vo.RealtimeMsgVo;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class RemoteMessageService {
	@Autowired
	private RedisTemplate redisTemplate;

	/**
	 * 发送消息，实时消息和延时消息都按照消息发送时间排序
	 * 
	 * @param bussinessType 消息业务类型（需要在消息服务中配置）
	 * @param bussinessId   消息业务ID
	 * @param msgValue      消息内容
	 * @return
	 */
	public boolean sendMessage(String bussinessType, String bussinessId, Object msgValue) {
		return sendMessage(bussinessType, bussinessId, msgValue, null);
	}

	/**
	 * 发送消息，实时消息按照发送时间排序，延时消息按照score排序，score建议是业务数据中的时间戳
	 * 
	 * @param bussinessType 消息业务类型（需要在消息服务中配置）
	 * @param bussinessId   消息业务ID
	 * @param msgValue      消息内容
	 * @param timestamp     消息排序分数（延时消息使用，实时消息不生效）
	 * @return
	 */
	public boolean sendMessage(String bussinessType, String bussinessId, Object msgValue, Double timestamp) {
		String msgKey = MessageConstants.getMsgKey(bussinessType, bussinessId);
		if (!redisTemplate.hasKey(MessageConstants.getCacheMsgKey(msgKey))) {
			// 该消息没有订阅者
			return false;
		}

		// 发送实时消息(redis的订阅发布功能)
		redisTemplate.convertAndSend(MessageConstants.MSG_REALTIME_CHANNEL,
				new RealtimeMsgVo(bussinessType, bussinessId, msgValue));

		// 发送延时消息（redis的zset有序队列）
		if (redisTemplate.hasKey(MessageConstants.getDelayMillisecondKey(msgKey))) {
			// 添加消息到redis队列
			if (timestamp == null) {
				// redis时间
				timestamp = Double.valueOf(redisTemplate.getConnectionFactory().getConnection().time());
			}
			String queueKey = MessageConstants.getDelayQueueKey(msgKey);
			log.info("add to redis zset:{},timestamp:{}", queueKey, timestamp);
			redisTemplate.opsForZSet().add(queueKey, msgValue, timestamp);
		}
		return true;
	}
}
